package router

import (
	"context"
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"os"
	"os/signal"
	"oss-api/app/api"
	"oss-api/app/service"
	"oss-api/boot"
	"time"
)

var Engine *gin.Engine

func init() {
	fmt.Printf("[oss-api] %s [INFO] : 初始化路由配置\n", time.Now().Format("2006-01-02 15:04:05"))
	Engine = gin.Default()
	Engine.Use(service.CorsMiddle())
	// 路由配置
	group := Engine.Group(boot.Config.Server.ContextPath)
	{
		installGroup := group.Group("install")
		{
			installGroup.GET("check", api.Install.CheckConfig)
			installGroup.POST("database", api.Install.SettingDatabase) // 配置数据库信息
			installGroup.POST("storage", api.Install.SettingStorage)   // 配置存储源信息
			installGroup.POST("user", api.Install.SettingUser)         // 配置用户信息
			installGroup.POST("login", api.Install.LoginUser)          // 登陆
		}

		// 中间件使用
		apiGroup := group.Group("api")
		{
			apiGroup.Use(service.CheckConfig())
			apiGroup.Use(service.JwtMiddle())
			categoryGroup := apiGroup.Group("category")
			{
				categoryGroup.POST("add", api.Category.CreateCategory)   // 增加分类信息
				categoryGroup.GET("custom", api.Category.CustomCategory) // 获取自定义分类
			}
			// 资源
			routerGroup := apiGroup.Group("resources")
			{
				routerGroup.POST("page", api.Resource.SpecifyResource)
				routerGroup.POST("upload", api.Resource.UploadResource)
				routerGroup.GET("delete", api.Resource.DeleteResource) // 资源放入回收站
				routerGroup.GET("tags", api.Resource.GetAllTags)       // 获取所有的资源tag
			}
			// 回收站
			garbageGroup := apiGroup.Group("garbage")
			{
				garbageGroup.POST("page", api.Garbage.Page)          // 分页显示回收站列表
				garbageGroup.GET("recovery", api.Garbage.Recovery)   // 回收信息
				garbageGroup.GET("reduction", api.Garbage.Reduction) // 还原资源
			}
		}

	}

}

func Run() {

	server := &http.Server{
		Addr:         boot.Config.Server.Port,
		Handler:      Engine,
		ReadTimeout:  boot.Config.Server.ReadTimeout * time.Second,
		WriteTimeout: boot.Config.Server.WriteTimeout * time.Second,
		//MaxHeaderBytes: boot.Config.Server.MaxHeaderBytes,
	}

	go func() {
		if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			panic(fmt.Sprintf("启动服务失败：%s\n", err.Error()))
		}
	}()

	// 等待中断信号以优雅地关闭服务器（设置 5 秒的超时时间）
	quit := make(chan os.Signal)
	signal.Notify(quit, os.Interrupt)
	<-quit
	fmt.Printf("[oss-api] %s [INFO] : 服务正在停止......\n", time.Now().Format("2006-01-02 15:04:05"))

	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	if err := server.Shutdown(ctx); err != nil {
		panic(fmt.Sprintf("[oss-api] %s [ERROR] : 服务停止失败：%s\n", time.Now().Format("2006-01-02 15:04:05"), err))
	}
	fmt.Printf("[oss-api] %s [INFO] : 服务停止\n", time.Now().Format("2006-01-02 15:04:05"))
}
